import json
import logging

from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from django.contrib.auth import login,logout#从django的 发布版 的 授权模块 导入 登录

from utils.json_fun import to_json_data
from utils.res_code import Code,error_map
from .forms import RegisterForm,LoginForm
from .models import Users

logger = logging.getLogger("django")

# 1.创建一个登录类视图
class LoginView(View):
    '''
    登录视图
    '''
    # 2.获取前端参数
    def get(self,request):
        '''get请求直接反回页面'''
        return render(request, 'users/login.html')
    def post(self,request):
        '''post请求处理数据'''
        try:
            json_data = request.body
            # to_dict_data = json.loads(josn_data.decode('utf8')) if josn_data else None
            if not json_data:
                return to_json_data(errno=Code.PARAMERR, errmsg="参数为空,请重新输入")
            dict_data = json.loads(json_data.decode('utf8'))
        except Exception as e:
            logger.info('错误信息:\n{}'.format(e))
            return to_json_data(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])
    # 3.校验参数
    # 4.用户登录设置session信息
        form = LoginForm(data=dict_data,request=request)  # 传入表单数据

        if form.is_valid():
            return to_json_data(errmsg='登录成功')
        else:
            #序列化错误信息
            err_msg_list = []
            for item in form.errors.get_json_data().values():
                err_msg_list.append(item[0].get('message'))
            err_msg_str = '/'.join(err_msg_list)#拼接错误信息为一个字符串
            # 5.反回前端
            return to_json_data(errno=Code.PARAMERR,errmsg=err_msg_str)

# 1.创建一个登出类
class LogoutView(View):
    # 2.接收前端request中的session等信息
    def get(self,request):
        # 3.django自带的登出方法
        logout(request)
        # 4.重定向至登录
        return redirect(reverse("user:login"))#重定向("app_name:url_name")
# 1.用户注册创建一个类
class RegisterView(View):
    '''
    user register
    用户注册视图
    url:/register/
    '''
    # 2.创建get方法渲染页面
    def get(self,request):
        return render(request,'users/register.html')
    # 3.创建post方法接收参数
    def post(self,request):
        try:
            json_data = request.body
            # to_dict_data = json.loads(josn_data.decode('utf8')) if josn_data else None
            if not json_data:
                return to_json_data(errno=Code.PARAMERR,errmsg="参数为空,请重新输入")
            dict_data = json.loads(json_data.decode('utf8'))
        except Exception as e:
            logger.info('错误信息:\n{}'.format(e))
            return to_json_data(errno=Code.UNKOWNERR,errmsg=error_map[Code.UNKOWNERR])
        # 4.form表单校验参数
        form = RegisterForm(data=dict_data)  # 传入表单数据
        # 5.将用户信息保存到数据库
        if form.is_valid():#如果校验成功
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            mobile = form.cleaned_data.get('mobile')
            user = Users.objects.create_user(username=username,password=password,mobile=mobile)
            login(request,user)#将 用户登录信息 存放到session
            # 6.反回前端
            return to_json_data(errmsg='注册成功!')
        else:#校验失败
            #序列化错误信息
            err_msg_list = []
            for item in form.errors.get_json_data().values():
                err_msg_list.append(item[0].get('message'))
            err_msg_str = '/'.join(err_msg_list)#拼接错误信息为一个字符串
            # 6.反回前端
            return to_json_data(errno=Code.PARAMERR,errmsg=err_msg_str)
